home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Musique / Quod Libet / quodlibet-3.3.0-portable.exe / quodlibet-3.3.0-portable / data / bin / quodlibet / devices / _gpod.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2014-12-31  |  32KB  |  1,115 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.7)
  3.  
  4. '''ctypes bindings for libgpod.
  5.  
  6. Similar to the in libgpod included swig bindings except:
  7.   - Functions for pixbuf handling are missing (itdb_artwork_*)
  8.   - Swig wrappers (sw_*) from the swig bindings are mostly missing
  9.  
  10. These are needed since the original bindings depend on pygtk which breaks
  11. in combination with pygobject.
  12. '''
  13. from quodlibet.util import load_library
  14. from ctypes import *
  15.  
  16. try:
  17.     _glib = load_library([
  18.         'libglib-2.0.so.0',
  19.         'libglib-2.0.so',
  20.         'glib-2.0'])[0]
  21. except OSError:
  22.     raise ImportError("Couldn't find libglib-2.0")
  23.  
  24.  
  25. try:
  26.     _lib = load_library([
  27.         'libgpod.so.4'])[0]
  28. except OSError:
  29.     raise ImportError("Couldn't find libgpod")
  30.  
  31. gchar_p = c_char_p
  32. gchar = c_char
  33. guchar = c_uint8
  34. guchar_p = POINTER(c_uint8)
  35. guint = c_uint
  36. gpointer = c_void_p
  37. gint32 = c_int32
  38. guint32 = c_uint32
  39. gint = c_int
  40. gboolean = c_bool
  41. gint8 = c_int8
  42. guint8 = c_uint8
  43. gint16 = c_int16
  44. guint16 = c_uint16
  45. gint64 = c_int64
  46. guint64 = c_uint64
  47. gfloat = c_float
  48. gdouble = c_double
  49. gshort = c_short
  50. gushort = c_ushort
  51. glong = c_long
  52. gulong = c_ulong
  53. gsize = c_size_t
  54. gconstpointer = c_void_p
  55. time_t = c_ulong
  56. g_strdup = _glib.g_strdup
  57. g_strdup.argtypes = [
  58.     gchar_p]
  59. g_strdup.restype = gpointer
  60. g_free = _glib.g_free
  61. g_free.argtypes = [
  62.     gpointer]
  63. g_free.restype = None
  64.  
  65. class StructPointerMixin(object):
  66.     '''Access struct fields through the struct pointer'''
  67.     
  68.     def _get_type(self, name):
  69.         '''Returns the type of the field'''
  70.         for n, type_ in self._fields_:
  71.             if name == n:
  72.                 return type_
  73.         else:
  74.             raise KeyError
  75.  
  76.     
  77.     def __getattr__(self, name):
  78.         if not self:
  79.             raise AttributeError('NULL pointer access')
  80.         return getattr(self.contents, name)
  81.  
  82.     
  83.     def __setattr__(self, name, value):
  84.         if not self:
  85.             raise AttributeError('NULL pointer access')
  86.         if not hasattr(self.contents, name):
  87.             raise AttributeError('Invalid attribute: %r' % name)
  88.         type_ = self._get_type(name)
  89.         if type_ is gchar_p:
  90.             old_value = getattr(self.contents, name)
  91.             g_free(old_value)
  92.             value = g_strdup(value)
  93.         setattr(self.contents, name, value)
  94.  
  95.  
  96.  
  97. class GList(Structure):
  98.     pass
  99.  
  100.  
  101. class GListPtr(POINTER(GList), StructPointerMixin):
  102.     _type_ = GList
  103.  
  104. GList._fields_ = [
  105.     ('data', gpointer),
  106.     ('next', GListPtr),
  107.     ('prev', GListPtr)]
  108.  
  109. class GTreePtr(gpointer):
  110.     pass
  111.  
  112.  
  113. class Enum(guint):
  114.     
  115.     def __str__(self):
  116.         for a in (lambda .0: pass)(dir(self)):
  117.             if getattr(self, a) == self.value:
  118.                 return a
  119.         
  120.         return 'Unkown'
  121.  
  122.     
  123.     def __repr__(self):
  124.         return repr(str(self))
  125.  
  126.     
  127.     def __int__(self):
  128.         return self.value
  129.  
  130.  
  131.  
  132. class Flags(guint):
  133.     
  134.     def __str__(self):
  135.         values = []
  136.         for a in (lambda .0: pass)(dir(self)):
  137.             if getattr(self, a) & self.value:
  138.                 values.append(a)
  139.                 continue
  140.         if not ' | '.join(values):
  141.             pass
  142.         return 'Unkown'
  143.  
  144.     
  145.     def __repr__(self):
  146.         return repr(str(self))
  147.  
  148.     
  149.     def __int__(self):
  150.         return self.value
  151.  
  152.  
  153.  
  154. class IpodGeneration(Enum):
  155.     (UNKNOWN, FIRST, SECOND, THIRD, FOURTH, PHOTO, MOBILE, MINI_1, MINI_2, SHUFFLE_1, SHUFFLE_2, SHUFFLE_3, NANO_1, NANO_2, NANO_3, NANO_4, VIDEO_1, VIDEO_2, CLASSIC_1, CLASSIC_2, TOUCH_1, IPHONE_1, SHUFFLE_4, TOUCH_2, IPHONE_2, IPHONE_3, CLASSIC_3, NANO_5, TOUCH_3, IPAD_1, IPHONE_4, TOUCH_4, NANO_6) = range(33)
  156.  
  157.  
  158. class IpodModel(Enum):
  159.     (INVALID, UNKNOWN, COLOR, COLOR_U2, REGULAR, REGULAR_U2, MINI, MINI_BLUE, MINI_PINK, MINI_GREEN, MINI_GOLD, SHUFFLE, NANO_WHITE, NANO_BLACK, VIDEO_WHITE, VIDEO_BLACK, MOBILE_1, VIDEO_U2, NANO_SILVER, NANO_BLUE, NANO_GREEN, NANO_PINK, NANO_RED, NANO_YELLOW, NANO_PURPLE, NANO_ORANGE, IPHONE_1, SHUFFLE_SILVER, SHUFFLE_PINK, SHUFFLE_BLUE, SHUFFLE_GREEN, SHUFFLE_ORANGE, SHUFFLE_PURPLE, SHUFFLE_RED, CLASSIC_SILVER, CLASSIC_BLACK, TOUCH_SILVER, SHUFFLE_BLACK, IPHONE_WHITE, IPHONE_BLACK, SHUFFLE_GOLD, SHUFFLE_STAINLESS, IPAD) = range(43)
  160.  
  161.  
  162. class IpodInfo(Structure):
  163.     _fields_ = [
  164.         ('model_number', gchar_p),
  165.         ('capacity', c_double),
  166.         ('ipod_model', IpodModel),
  167.         ('ipod_generation', IpodGeneration),
  168.         ('musicdirs', guint),
  169.         ('reserved_int1', gint32),
  170.         ('reserved_int2', gint32),
  171.         ('reserved1', gconstpointer),
  172.         ('reserved2', gconstpointer)]
  173.  
  174.  
  175. class IpodInfoPtr(POINTER(IpodInfo), StructPointerMixin):
  176.     _type_ = IpodInfo
  177.  
  178. ITDB_SPL_STRING_MAXLEN = 255
  179. ITDB_SPL_DATE_IDENTIFIER = 0x2DAE2DAE2DAE2DAEL
  180.  
  181. class SPLMatch(Enum):
  182.     AND = 0
  183.     OR = 1
  184.  
  185.  
  186. class LimitType(Enum):
  187.     MINUTES = 1
  188.     MB = 2
  189.     SONGS = 3
  190.     HOURS = 4
  191.     GB = 5
  192.  
  193.  
  194. class LimitSort(Enum):
  195.     RANDOM = 2
  196.     SONG_NAME = 3
  197.     ALBUM = 4
  198.     ARTIST = 5
  199.     GENRE = 7
  200.     MOST_RECENTLY_ADDED = 16
  201.     LEAST_RECENTLY_ADDED = 0x80000010L
  202.     MOST_OFTEN_PLAYED = 20
  203.     LEAST_OFTEN_PLAYED = 0x80000014L
  204.     MOST_RECENTLY_PLAYED = 21
  205.     LEAST_RECENTLY_PLAYED = 0x80000015L
  206.     HIGHEST_RATING = 23
  207.     LOWEST_RATING = 0x80000017L
  208.  
  209.  
  210. class SPLAction(Enum):
  211.     IS_INT = 1
  212.     IS_GREATER_THAN = 16
  213.     IS_LESS_THAN = 64
  214.     IS_IN_THE_RANGE = 256
  215.     IS_IN_THE_LAST = 512
  216.     BINARY_AND = 1024
  217.     BINARY_UNKNOWN1 = 2048
  218.     IS_STRING = 16777217
  219.     CONTAINS = 16777218
  220.     STARTS_WITH = 16777220
  221.     ENDS_WITH = 16777224
  222.     IS_NOT_INT = 33554433
  223.     IS_NOT_GREATER_THAN = 33554448
  224.     IS_NOT_LESS_THAN = 33554496
  225.     IS_NOT_IN_THE_RANGE = 33554688
  226.     IS_NOT_IN_THE_LAST = 33554944
  227.     NOT_BINARY_AND = 33555456
  228.     BINARY_UNKNOWN2 = 33556480
  229.     IS_NOT = 50331649
  230.     DOES_NOT_CONTAIN = 50331650
  231.     DOES_NOT_START_WITH = 50331652
  232.     DOES_NOT_END_WITH = 50331656
  233.  
  234.  
  235. class SPLFieldType(Enum):
  236.     (STRING, INT, BOOLEAN, DATE, PLAYLIST, UNKNOWN, BINARY_AND) = range(1, 8)
  237.  
  238.  
  239. class SPLActionType(Enum):
  240.     (STRING, INT, DATE, RANGE_INT, RANGE_DATE, INTHELAST, PLAYLIST, NONE, INVALID, UNKNOWN, BINARY_AND) = range(1, 12)
  241.  
  242.  
  243. class SPLActionLast(Enum):
  244.     DAYS_VALUE = 86400
  245.     WEEKS_VALUE = 604800
  246.     MONTHS_VALUE = 2628000
  247.  
  248.  
  249. class SPLField(Enum):
  250.     SONG_NAME = 2
  251.     ALBUM = 3
  252.     ARTIST = 4
  253.     BITRATE = 5
  254.     SAMPLE_RATE = 6
  255.     YEAR = 7
  256.     GENRE = 8
  257.     KIND = 9
  258.     DATE_MODIFIED = 10
  259.     TRACKNUMBER = 11
  260.     SIZE = 12
  261.     TIME = 13
  262.     COMMENT = 14
  263.     DATE_ADDED = 16
  264.     COMPOSER = 18
  265.     PLAYCOUNT = 22
  266.     LAST_PLAYED = 23
  267.     DISC_NUMBER = 24
  268.     RATING = 25
  269.     COMPILATION = 31
  270.     BPM = 35
  271.     GROUPING = 39
  272.     PLAYLIST = 40
  273.     PURCHASE = 41
  274.     DESCRIPTION = 54
  275.     CATEGORY = 55
  276.     PODCAST = 57
  277.     VIDEO_KIND = 60
  278.     TVSHOW = 62
  279.     SEASON_NR = 63
  280.     SKIPCOUNT = 68
  281.     LAST_SKIPPED = 69
  282.     ALBUMARTIST = 71
  283.     SORT_SONG_NAME = 78
  284.     SORT_ALBUM = 79
  285.     SORT_ARTIST = 80
  286.     SORT_ALBUMARTIST = 81
  287.     SORT_COMPOSER = 82
  288.     SORT_TVSHOW = 83
  289.     ALBUM_RATING = 90
  290.  
  291.  
  292. class SPLPref(Structure):
  293.     _fields_ = [
  294.         ('liveupdate', guint8),
  295.         ('checkrules', guint8),
  296.         ('checklimits', guint8),
  297.         ('limittype', guint32),
  298.         ('limitsort', guint32),
  299.         ('limitvalue', guint32),
  300.         ('matchcheckedonly', guint8),
  301.         ('reserved_int1', gint32),
  302.         ('reserved_int2', gint32),
  303.         ('reserved1', gpointer),
  304.         ('reserved2', gpointer)]
  305.  
  306.  
  307. class SPLRule(Structure):
  308.     _fields_ = [
  309.         ('field', guint32),
  310.         ('action', guint32),
  311.         ('string', gchar_p),
  312.         ('fromvalue', guint64),
  313.         ('fromdate', guint64),
  314.         ('fromunits', guint64),
  315.         ('tovalue', guint64),
  316.         ('todate', gint64),
  317.         ('tounits', guint64),
  318.         ('unk052', guint32),
  319.         ('unk056', guint32),
  320.         ('unk060', guint32),
  321.         ('unk064', guint32),
  322.         ('unk068', guint32),
  323.         ('reserved_int1', gint32),
  324.         ('reserved_int2', gint32),
  325.         ('reserved1', gpointer),
  326.         ('reserved2', gpointer)]
  327.  
  328.  
  329. class SPLRulePtr(POINTER(SPLRule), StructPointerMixin):
  330.     _type_ = SPLRule
  331.  
  332.  
  333. class SPLRules(Structure):
  334.     _fields_ = [
  335.         ('unk004', guint32),
  336.         ('match_operator', guint32),
  337.         ('rules', GListPtr),
  338.         ('reserved_int1', gint32),
  339.         ('reserved_int2', gint32),
  340.         ('reserved1', gpointer),
  341.         ('reserved2', gpointer)]
  342.  
  343.  
  344. class Chapter(Structure):
  345.     _fields_ = [
  346.         ('startpos', guint32),
  347.         ('chaptertitle', gchar_p),
  348.         ('reserved_int1', gint32),
  349.         ('reserved_int2', gint32),
  350.         ('reserved1', gpointer),
  351.         ('reserved2', gpointer)]
  352.  
  353.  
  354. class ChapterPtr(POINTER(Chapter), StructPointerMixin):
  355.     _type_ = Chapter
  356.  
  357.  
  358. class Chapterdata(Structure):
  359.     _fields_ = [
  360.         ('chapters', GListPtr),
  361.         ('unk024', guint32),
  362.         ('unk028', guint32),
  363.         ('unk032', guint32),
  364.         ('reserved_int1', gint32),
  365.         ('reserved_int2', gint32),
  366.         ('reserved1', gpointer),
  367.         ('reserved2', gpointer)]
  368.  
  369.  
  370. class ChapterdataPtr(POINTER(Chapterdata), StructPointerMixin):
  371.     _type_ = Chapterdata
  372.  
  373. ITDB_RATING_STEP = 20
  374.  
  375. class ThumbPtr(c_void_p):
  376.     pass
  377.  
  378. UserDataDuplicateFunc = CFUNCTYPE(gpointer, gpointer)
  379. UserDataDestroyFunc = CFUNCTYPE(None, gpointer)
  380.  
  381. class Artwork(Structure):
  382.     _fields_ = [
  383.         ('thumbnail', ThumbPtr),
  384.         ('id', guint32),
  385.         ('dbid', guint64),
  386.         ('unk028', gint32),
  387.         ('rating', guint32),
  388.         ('unk036', gint32),
  389.         ('creation_date', time_t),
  390.         ('digitized_date', time_t),
  391.         ('artwork_size', guint32),
  392.         ('reserved_int1', gint32),
  393.         ('reserved_int2', gint32),
  394.         ('reserved1', gpointer),
  395.         ('reserved2', gpointer),
  396.         ('usertype', guint64),
  397.         ('userdata', gpointer),
  398.         ('userdata_duplicate', UserDataDuplicateFunc),
  399.         ('userdata_destroy', UserDataDestroyFunc)]
  400.  
  401.  
  402. class ArtworkPtr(POINTER(Artwork), StructPointerMixin):
  403.     _type_ = Artwork
  404.  
  405.  
  406. class PhotoDB(Structure):
  407.     _fields_ = [
  408.         ('photos', GListPtr),
  409.         ('photoalbums', GListPtr),
  410.         ('reserved_int1', gint32),
  411.         ('reserved_int2', gint32),
  412.         ('reserved1', gpointer),
  413.         ('reserved2', gpointer),
  414.         ('usertype', guint64),
  415.         ('userdata', gpointer),
  416.         ('userdata_duplicate', UserDataDuplicateFunc),
  417.         ('userdata_destroy', UserDataDestroyFunc)]
  418.  
  419.  
  420. class PhotoDBPtr(POINTER(PhotoDB), StructPointerMixin):
  421.     _type_ = PhotoDB
  422.  
  423.  
  424. class DevicePtr(c_void_p):
  425.     pass
  426.  
  427.  
  428. class iTunesDB_PrivatePtr(c_void_p):
  429.     pass
  430.  
  431.  
  432. class iTunesDB(Structure):
  433.     _fields_ = [
  434.         ('tracks', GListPtr),
  435.         ('playlists', GListPtr),
  436.         ('filename', gchar_p),
  437.         ('device', DevicePtr),
  438.         ('version', guint32),
  439.         ('id', guint64),
  440.         ('tzoffset', gint32),
  441.         ('reserved_int2', gint32),
  442.         ('priv', iTunesDB_PrivatePtr),
  443.         ('reserved2', gpointer),
  444.         ('usertype', guint64),
  445.         ('userdata', gpointer),
  446.         ('userdata_duplicate', UserDataDuplicateFunc),
  447.         ('userdata_destroy', UserDataDestroyFunc)]
  448.  
  449.  
  450. class iTunesDBPtr(POINTER(iTunesDB), StructPointerMixin):
  451.     _type_ = iTunesDB
  452.  
  453.  
  454. class PhotoAlbum(Structure):
  455.     _fields_ = [
  456.         ('photodb', PhotoDBPtr),
  457.         ('name', gchar_p),
  458.         ('members', GListPtr),
  459.         ('album_type', guint8),
  460.         ('playmusic', guint8),
  461.         ('repeat', guint8),
  462.         ('random', guint8),
  463.         ('show_titles', guint8),
  464.         ('transition_direction', guint8),
  465.         ('slide_duration', gint32),
  466.         ('transition_duration', gint32),
  467.         ('song_id', gint64),
  468.         ('unk024', gint32),
  469.         ('unk028', gint16),
  470.         ('unk044', gint32),
  471.         ('unk048', gint32),
  472.         ('album_id', gint32),
  473.         ('prev_album_id', gint32),
  474.         ('reserved_int1', gint32),
  475.         ('reserved_int2', gint32),
  476.         ('reserved1', gpointer),
  477.         ('reserved2', gpointer),
  478.         ('usertype', guint64),
  479.         ('userdata', gpointer),
  480.         ('userdata_duplicate', UserDataDuplicateFunc),
  481.         ('userdata_destroy', UserDataDestroyFunc)]
  482.  
  483.  
  484. class PhotoAlbumPtr(POINTER(PhotoAlbum), StructPointerMixin):
  485.     _type_ = PhotoAlbum
  486.  
  487.  
  488. class Playlist_PrivatePtr(c_void_p):
  489.     pass
  490.  
  491.  
  492. class Playlist(Structure):
  493.     _fields_ = [
  494.         ('itdb', iTunesDBPtr),
  495.         ('name', gchar_p),
  496.         ('type', guint8),
  497.         ('flag1', guint8),
  498.         ('flag2', guint8),
  499.         ('flag3', guint8),
  500.         ('num', gint),
  501.         ('members', GListPtr),
  502.         ('is_spl', gboolean),
  503.         ('timestamp', time_t),
  504.         ('id', guint64),
  505.         ('sortorder', guint32),
  506.         ('podcastflag', guint32),
  507.         ('splpref', SPLPref),
  508.         ('splrules', SPLRules),
  509.         ('reserved100', gpointer),
  510.         ('reserved101', gpointer),
  511.         ('reserved_int1', gint32),
  512.         ('reserved_int2', gint32),
  513.         ('*priv', Playlist_PrivatePtr),
  514.         ('reserved2', gpointer),
  515.         ('usertype', guint64),
  516.         ('userdata', gpointer),
  517.         ('userdata_duplicate', UserDataDuplicateFunc),
  518.         ('userdata_destroy', UserDataDestroyFunc)]
  519.  
  520.  
  521. class PlaylistPtr(POINTER(Playlist), StructPointerMixin):
  522.     _type_ = Playlist
  523.  
  524.  
  525. class PlaylistSortOrder(Enum):
  526.     MANUAL = 1
  527.     TITLE = 3
  528.     ALBUM = 4
  529.     ARTIST = 5
  530.     BITRATE = 6
  531.     GENRE = 7
  532.     FILETYPE = 8
  533.     TIME_MODIFIED = 9
  534.     TRACK_NR = 10
  535.     SIZE = 11
  536.     TIME = 12
  537.     YEAR = 13
  538.     SAMPLERATE = 14
  539.     COMMENT = 15
  540.     TIME_ADDED = 16
  541.     EQUALIZER = 17
  542.     COMPOSER = 18
  543.     PLAYCOUNT = 20
  544.     TIME_PLAYED = 21
  545.     CD_NR = 22
  546.     RATING = 23
  547.     RELEASE_DATE = 24
  548.     BPM = 25
  549.     GROUPING = 26
  550.     CATEGORY = 27
  551.     DESCRIPTION = 28
  552.  
  553.  
  554. class Mediatype(Flags):
  555.     AUDIO = 1
  556.     MOVIE = 2
  557.     PODCAST = 4
  558.     AUDIOBOOK = 8
  559.     MUSICVIDEO = 32
  560.     TVSHOW = 64
  561.     RINGTONE = 16384
  562.     RENTAL = 32768
  563.     ITUNES_EXTRA = 65536
  564.     MEMO = 1048576
  565.     ITUNES_U = 2097152
  566.     EPUB_BOOK = 4194304
  567.     PDF_BOOK = 8388608
  568.  
  569.  
  570. class Track_PrivatePtr(c_void_p):
  571.     pass
  572.  
  573.  
  574. class Track(Structure):
  575.     _fields_ = [
  576.         ('itdb', iTunesDBPtr),
  577.         ('title', gchar_p),
  578.         ('ipod_path', gchar_p),
  579.         ('album', gchar_p),
  580.         ('artist', gchar_p),
  581.         ('genre', gchar_p),
  582.         ('filetype', gchar_p),
  583.         ('comment', gchar_p),
  584.         ('category', gchar_p),
  585.         ('composer', gchar_p),
  586.         ('grouping', gchar_p),
  587.         ('description', gchar_p),
  588.         ('podcasturl', gchar_p),
  589.         ('podcastrss', gchar_p),
  590.         ('chapterdata', ChapterdataPtr),
  591.         ('subtitle', gchar_p),
  592.         ('tvshow', gchar_p),
  593.         ('tvepisode', gchar_p),
  594.         ('tvnetwork', gchar_p),
  595.         ('albumartist', gchar_p),
  596.         ('keywords', gchar_p),
  597.         ('sort_artist', gchar_p),
  598.         ('sort_title', gchar_p),
  599.         ('sort_album', gchar_p),
  600.         ('sort_albumartist', gchar_p),
  601.         ('sort_composer', gchar_p),
  602.         ('sort_tvshow', gchar_p),
  603.         ('id', guint32),
  604.         ('size', guint32),
  605.         ('tracklen', gint32),
  606.         ('cd_nr', gint32),
  607.         ('cds', gint32),
  608.         ('track_nr', gint32),
  609.         ('tracks', gint32),
  610.         ('bitrate', gint32),
  611.         ('samplerate', guint16),
  612.         ('samplerate_low', guint16),
  613.         ('year', gint32),
  614.         ('volume', gint32),
  615.         ('soundcheck', guint32),
  616.         ('time_added', time_t),
  617.         ('time_modified', time_t),
  618.         ('time_played', time_t),
  619.         ('bookmark_time', guint32),
  620.         ('rating', guint32),
  621.         ('playcount', guint32),
  622.         ('playcount2', guint32),
  623.         ('recent_playcount', guint32),
  624.         ('transferred', gboolean),
  625.         ('BPM', gint16),
  626.         ('app_rating', guint8),
  627.         ('type1', guint8),
  628.         ('type2', guint8),
  629.         ('compilation', guint8),
  630.         ('starttime', guint32),
  631.         ('stoptime', guint32),
  632.         ('checked', guint8),
  633.         ('dbid', guint64),
  634.         ('drm_userid', guint32),
  635.         ('visible', guint32),
  636.         ('filetype_marker', guint32),
  637.         ('artwork_count', guint16),
  638.         ('artwork_size', guint32),
  639.         ('samplerate2', c_float),
  640.         ('unk126', guint16),
  641.         ('unk132', guint32),
  642.         ('time_released', time_t),
  643.         ('unk144', guint16),
  644.         ('explicit_flag', guint16),
  645.         ('unk148', guint32),
  646.         ('unk152', guint32),
  647.         ('skipcount', guint32),
  648.         ('recent_skipcount', guint32),
  649.         ('last_skipped', guint32),
  650.         ('has_artwork', guint8),
  651.         ('skip_when_shuffling', guint8),
  652.         ('remember_playback_position', guint8),
  653.         ('flag4', guint8),
  654.         ('dbid2', guint64),
  655.         ('lyrics_flag', guint8),
  656.         ('movie_flag', guint8),
  657.         ('mark_unplayed', guint8),
  658.         ('unk179', guint8),
  659.         ('unk180', guint32),
  660.         ('pregap', guint32),
  661.         ('samplecount', guint64),
  662.         ('unk196', guint32),
  663.         ('postgap', guint32),
  664.         ('unk204', guint32),
  665.         ('mediatype', guint32),
  666.         ('season_nr', guint32),
  667.         ('episode_nr', guint32),
  668.         ('unk220', guint32),
  669.         ('unk224', guint32),
  670.         ('unk228', guint32),
  671.         ('unk232', guint32),
  672.         ('unk236', guint32),
  673.         ('unk240', guint32),
  674.         ('unk244', guint32),
  675.         ('gapless_data', guint32),
  676.         ('unk252', guint32),
  677.         ('gapless_track_flag', guint16),
  678.         ('gapless_album_flag', guint16),
  679.         ('obsolete', guint16),
  680.         ('artwork', ArtworkPtr),
  681.         ('mhii_link', guint32),
  682.         ('reserved_int1', gint32),
  683.         ('reserved_int2', gint32),
  684.         ('reserved_int3', gint32),
  685.         ('reserved_int4', gint32),
  686.         ('reserved_int5', gint32),
  687.         ('reserved_int6', gint32),
  688.         ('priv', Track_PrivatePtr),
  689.         ('reserved2', gpointer),
  690.         ('reserved3', gpointer),
  691.         ('reserved4', gpointer),
  692.         ('reserved5', gpointer),
  693.         ('reserved6', gpointer),
  694.         ('usertype', guint64),
  695.         ('userdata', gpointer),
  696.         ('userdata_duplicate', UserDataDuplicateFunc),
  697.         ('userdata_destroy', UserDataDestroyFunc)]
  698.  
  699.  
  700. class TrackPtr(POINTER(Track), StructPointerMixin):
  701.     _type_ = Track
  702.  
  703.  
  704. class FileError(Enum):
  705.     (SEEK, CORRUPT, NOTFOUND, RENAME, ITDB_CORRUPT) = range(5)
  706.  
  707.  
  708. class Error(Enum):
  709.     (SEEK, CORRUPT, NOTFOUND, RENAME, ITDB_CORRUPT, SQLITE) = range(6)
  710.  
  711.  
  712. class GErrorPtrPtr(c_void_p):
  713.     pass
  714.  
  715. _functions = [
  716.     ('itdb_parse', iTunesDBPtr, [
  717.         gchar_p,
  718.         GErrorPtrPtr]),
  719.     ('itdb_parse_file', iTunesDBPtr, [
  720.         gchar_p,
  721.         GErrorPtrPtr]),
  722.     ('itdb_write', gboolean, [
  723.         iTunesDBPtr,
  724.         GErrorPtrPtr]),
  725.     ('itdb_write_file', gboolean, [
  726.         iTunesDBPtr,
  727.         gchar_p,
  728.         GErrorPtrPtr]),
  729.     ('itdb_shuffle_write', gboolean, [
  730.         iTunesDBPtr,
  731.         GErrorPtrPtr]),
  732.     ('itdb_shuffle_write_file', gboolean, [
  733.         iTunesDBPtr,
  734.         gchar_p,
  735.         GErrorPtrPtr]),
  736.     ('itdb_start_sync', gboolean, [
  737.         iTunesDBPtr]),
  738.     ('itdb_stop_sync', gboolean, [
  739.         iTunesDBPtr]),
  740.     ('itdb_new', iTunesDBPtr, []),
  741.     ('itdb_free', None, [
  742.         iTunesDBPtr]),
  743.     ('itdb_duplicate', iTunesDBPtr, [
  744.         iTunesDBPtr]),
  745.     ('itdb_tracks_number', guint32, [
  746.         iTunesDBPtr]),
  747.     ('itdb_tracks_number_nontransferred', guint32, [
  748.         iTunesDBPtr]),
  749.     ('itdb_playlists_number', guint32, [
  750.         iTunesDBPtr]),
  751.     ('itdb_musicdirs_number', gint, [
  752.         iTunesDBPtr]),
  753.     ('itdb_resolve_path', gchar_p, [
  754.         gchar_p,
  755.         POINTER(gchar_p)]),
  756.     ('itdb_rename_files', gboolean, [
  757.         gchar_p,
  758.         GErrorPtrPtr]),
  759.     ('itdb_cp_get_dest_filename', gchar_p, [
  760.         TrackPtr,
  761.         gchar_p,
  762.         gchar_p,
  763.         GErrorPtrPtr]),
  764.     ('itdb_cp', gboolean, [
  765.         gchar_p,
  766.         gchar_p,
  767.         GErrorPtrPtr]),
  768.     ('itdb_cp_finalize', TrackPtr, [
  769.         TrackPtr,
  770.         gchar_p,
  771.         gchar_p,
  772.         GErrorPtrPtr]),
  773.     ('itdb_cp_track_to_ipod', gboolean, [
  774.         TrackPtr,
  775.         gchar_p,
  776.         GErrorPtrPtr]),
  777.     ('itdb_filename_fs2ipod', None, [
  778.         gchar_p]),
  779.     ('itdb_filename_ipod2fs', None, [
  780.         gchar_p]),
  781.     ('itdb_filename_on_ipod', gchar_p, [
  782.         TrackPtr]),
  783.     ('itdb_set_mountpoint', None, [
  784.         iTunesDBPtr,
  785.         gchar_p]),
  786.     ('itdb_get_mountpoint', gchar_p, [
  787.         iTunesDBPtr]),
  788.     ('itdb_get_control_dir', gchar_p, [
  789.         gchar_p]),
  790.     ('itdb_get_itunes_dir', gchar_p, [
  791.         gchar_p]),
  792.     ('itdb_get_music_dir', gchar_p, [
  793.         gchar_p]),
  794.     ('itdb_get_artwork_dir', gchar_p, [
  795.         gchar_p]),
  796.     ('itdb_get_photos_dir', gchar_p, [
  797.         gchar_p]),
  798.     ('itdb_get_photos_thumb_dir', gchar_p, [
  799.         gchar_p]),
  800.     ('itdb_get_device_dir', gchar_p, [
  801.         gchar_p]),
  802.     ('itdb_get_itunesdb_path', gchar_p, [
  803.         gchar_p]),
  804.     ('itdb_get_itunescdb_path', gchar_p, [
  805.         gchar_p]),
  806.     ('itdb_get_itunessd_path', gchar_p, [
  807.         gchar_p]),
  808.     ('itdb_get_artworkdb_path', gchar_p, [
  809.         gchar_p]),
  810.     ('itdb_get_photodb_path', gchar_p, [
  811.         gchar_p]),
  812.     ('itdb_get_path', gchar_p, [
  813.         gchar_p,
  814.         gchar_p]),
  815.     ('itdb_device_new', DevicePtr, []),
  816.     ('itdb_device_free', None, [
  817.         DevicePtr]),
  818.     ('itdb_device_set_mountpoint', None, [
  819.         DevicePtr,
  820.         gchar_p]),
  821.     ('itdb_device_read_sysinfo', gboolean, [
  822.         DevicePtr]),
  823.     ('itdb_device_write_sysinfo', gboolean, [
  824.         DevicePtr,
  825.         GErrorPtrPtr]),
  826.     ('itdb_device_get_sysinfo', gchar_p, [
  827.         DevicePtr,
  828.         gchar_p]),
  829.     ('itdb_device_set_sysinfo', None, [
  830.         DevicePtr,
  831.         gchar_p,
  832.         gchar_p]),
  833.     ('itdb_device_get_ipod_info', IpodInfoPtr, [
  834.         DevicePtr]),
  835.     ('itdb_info_get_ipod_info_table', IpodInfoPtr, []),
  836.     ('itdb_device_supports_artwork', gboolean, [
  837.         DevicePtr]),
  838.     ('itdb_device_supports_chapter_image', gboolean, [
  839.         DevicePtr]),
  840.     ('itdb_device_supports_video', gboolean, [
  841.         DevicePtr]),
  842.     ('itdb_device_supports_photo', gboolean, [
  843.         DevicePtr]),
  844.     ('itdb_device_supports_podcast', gboolean, [
  845.         DevicePtr]),
  846.     ('itdb_info_get_ipod_model_name_string', gchar_p, [
  847.         IpodModel]),
  848.     ('itdb_info_get_ipod_generation_string', gchar_p, [
  849.         IpodGeneration]),
  850.     ('itdb_device_get_uuid', gchar_p, [
  851.         DevicePtr]),
  852.     ('itdb_track_new', TrackPtr, []),
  853.     ('itdb_track_free', None, [
  854.         TrackPtr]),
  855.     ('itdb_track_add', None, [
  856.         iTunesDBPtr,
  857.         TrackPtr,
  858.         gint32]),
  859.     ('itdb_track_remove', None, [
  860.         TrackPtr]),
  861.     ('itdb_track_unlink', None, [
  862.         TrackPtr]),
  863.     ('itdb_track_duplicate', TrackPtr, [
  864.         TrackPtr]),
  865.     ('itdb_track_by_id', TrackPtr, [
  866.         iTunesDBPtr,
  867.         guint32]),
  868.     ('itdb_track_id_tree_create', GTreePtr, [
  869.         iTunesDBPtr]),
  870.     ('itdb_track_id_tree_destroy', None, [
  871.         GTreePtr]),
  872.     ('itdb_track_id_tree_by_id', TrackPtr, [
  873.         GTreePtr,
  874.         guint32]),
  875.     ('itdb_playlist_new', PlaylistPtr, [
  876.         gchar_p,
  877.         gboolean]),
  878.     ('itdb_playlist_free', None, [
  879.         PlaylistPtr]),
  880.     ('itdb_playlist_add', None, [
  881.         iTunesDBPtr,
  882.         PlaylistPtr,
  883.         gint32]),
  884.     ('itdb_playlist_move', None, [
  885.         PlaylistPtr,
  886.         gint32]),
  887.     ('itdb_playlist_remove', None, [
  888.         PlaylistPtr]),
  889.     ('itdb_playlist_unlink', None, [
  890.         PlaylistPtr]),
  891.     ('itdb_playlist_duplicate', PlaylistPtr, [
  892.         PlaylistPtr]),
  893.     ('itdb_playlist_exists', gboolean, [
  894.         iTunesDBPtr,
  895.         PlaylistPtr]),
  896.     ('itdb_playlist_add_track', None, [
  897.         PlaylistPtr,
  898.         TrackPtr,
  899.         gint32]),
  900.     ('itdb_playlist_by_id', PlaylistPtr, [
  901.         iTunesDBPtr,
  902.         guint64]),
  903.     ('itdb_playlist_by_nr', PlaylistPtr, [
  904.         iTunesDBPtr,
  905.         guint32]),
  906.     ('itdb_playlist_by_name', PlaylistPtr, [
  907.         iTunesDBPtr,
  908.         gchar_p]),
  909.     ('itdb_playlist_contains_track', gboolean, [
  910.         PlaylistPtr,
  911.         TrackPtr]),
  912.     ('itdb_playlist_contain_track_number', guint32, [
  913.         TrackPtr]),
  914.     ('itdb_playlist_remove_track', None, [
  915.         PlaylistPtr,
  916.         TrackPtr]),
  917.     ('itdb_playlist_tracks_number', guint32, [
  918.         PlaylistPtr]),
  919.     ('itdb_playlist_randomize', None, [
  920.         PlaylistPtr]),
  921.     ('itdb_playlist_mpl', PlaylistPtr, [
  922.         iTunesDBPtr]),
  923.     ('itdb_playlist_is_mpl', gboolean, [
  924.         PlaylistPtr]),
  925.     ('itdb_playlist_set_mpl', None, [
  926.         PlaylistPtr]),
  927.     ('itdb_playlist_podcasts', PlaylistPtr, [
  928.         iTunesDBPtr]),
  929.     ('itdb_playlist_is_podcasts', gboolean, [
  930.         PlaylistPtr]),
  931.     ('itdb_playlist_set_podcasts', None, [
  932.         PlaylistPtr]),
  933.     ('itdb_playlist_is_audiobooks', gboolean, [
  934.         PlaylistPtr]),
  935.     ('itdb_splr_get_field_type', SPLFieldType, [
  936.         SPLRulePtr]),
  937.     ('itdb_splr_get_action_type', SPLActionType, [
  938.         SPLRulePtr]),
  939.     ('itdb_splr_validate', None, [
  940.         SPLRulePtr]),
  941.     ('itdb_splr_remove', None, [
  942.         PlaylistPtr,
  943.         SPLRulePtr]),
  944.     ('itdb_splr_new', SPLRulePtr, []),
  945.     ('itdb_splr_add', None, [
  946.         PlaylistPtr,
  947.         SPLRulePtr,
  948.         gint]),
  949.     ('itdb_splr_add_new', SPLRulePtr, [
  950.         PlaylistPtr,
  951.         gint]),
  952.     ('itdb_spl_copy_rules', None, [
  953.         PlaylistPtr,
  954.         PlaylistPtr]),
  955.     ('itdb_splr_eval', gboolean, [
  956.         SPLRulePtr,
  957.         TrackPtr]),
  958.     ('itdb_spl_update', None, [
  959.         PlaylistPtr]),
  960.     ('itdb_spl_update_all', None, [
  961.         iTunesDBPtr]),
  962.     ('itdb_spl_update_live', None, [
  963.         iTunesDBPtr]),
  964.     ('itdb_track_set_thumbnails', gboolean, [
  965.         TrackPtr,
  966.         gchar_p]),
  967.     ('itdb_track_set_thumbnails_from_data', gboolean, [
  968.         TrackPtr,
  969.         guchar_p,
  970.         gsize]),
  971.     ('itdb_track_set_thumbnails_from_pixbuf', gboolean, [
  972.         TrackPtr,
  973.         gpointer]),
  974.     ('itdb_track_has_thumbnails', gboolean, [
  975.         TrackPtr]),
  976.     ('itdb_track_remove_thumbnails', None, [
  977.         TrackPtr]),
  978.     ('itdb_track_get_thumbnail', gpointer, [
  979.         TrackPtr,
  980.         gint,
  981.         gint]),
  982.     ('itdb_photodb_parse', PhotoDBPtr, [
  983.         gchar_p,
  984.         GErrorPtrPtr]),
  985.     ('itdb_photodb_add_photo', ArtworkPtr, [
  986.         PhotoDBPtr,
  987.         gchar_p,
  988.         gint,
  989.         gint,
  990.         GErrorPtrPtr]),
  991.     ('itdb_photodb_add_photo_from_data', ArtworkPtr, [
  992.         PhotoDBPtr,
  993.         guchar_p,
  994.         gsize,
  995.         gint,
  996.         gint,
  997.         GErrorPtrPtr]),
  998.     ('itdb_photodb_add_photo_from_pixbuf', ArtworkPtr, [
  999.         PhotoDBPtr,
  1000.         gpointer,
  1001.         gint,
  1002.         gint,
  1003.         GErrorPtrPtr]),
  1004.     ('itdb_photodb_photoalbum_add_photo', None, [
  1005.         PhotoDBPtr,
  1006.         PhotoAlbumPtr,
  1007.         ArtworkPtr,
  1008.         gint]),
  1009.     ('itdb_photodb_photoalbum_create', PhotoAlbumPtr, [
  1010.         PhotoDBPtr,
  1011.         gchar_p,
  1012.         gint]),
  1013.     ('itdb_photodb_create', PhotoDBPtr, [
  1014.         gchar_p]),
  1015.     ('itdb_photodb_photoalbum_new', PhotoAlbumPtr, [
  1016.         gchar_p]),
  1017.     ('itdb_photodb_photoalbum_free', None, [
  1018.         PhotoAlbumPtr]),
  1019.     ('itdb_photodb_photoalbum_add', None, [
  1020.         PhotoDBPtr,
  1021.         PhotoAlbumPtr,
  1022.         gint]),
  1023.     ('itdb_photodb_free', None, [
  1024.         PhotoDBPtr]),
  1025.     ('itdb_photodb_write', gboolean, [
  1026.         PhotoDBPtr,
  1027.         GErrorPtrPtr]),
  1028.     ('itdb_photodb_remove_photo', None, [
  1029.         PhotoDBPtr,
  1030.         PhotoAlbumPtr,
  1031.         ArtworkPtr]),
  1032.     ('itdb_photodb_photoalbum_remove', None, [
  1033.         PhotoDBPtr,
  1034.         PhotoAlbumPtr,
  1035.         gboolean]),
  1036.     ('itdb_photodb_photoalbum_unlink', None, [
  1037.         PhotoAlbumPtr]),
  1038.     ('itdb_photodb_photoalbum_by_name', PhotoAlbumPtr, [
  1039.         PhotoDBPtr,
  1040.         gchar_p]),
  1041.     ('itdb_chapterdata_new', ChapterdataPtr, []),
  1042.     ('itdb_chapterdata_free', None, [
  1043.         ChapterdataPtr]),
  1044.     ('itdb_chapterdata_duplicate', ChapterdataPtr, [
  1045.         ChapterdataPtr]),
  1046.     ('itdb_chapterdata_remove_chapter', None, [
  1047.         ChapterdataPtr,
  1048.         ChapterPtr]),
  1049.     ('itdb_chapterdata_unlink_chapter', None, [
  1050.         ChapterdataPtr,
  1051.         ChapterPtr]),
  1052.     ('itdb_chapterdata_remove_chapters', None, [
  1053.         ChapterdataPtr]),
  1054.     ('itdb_chapter_new', ChapterPtr, []),
  1055.     ('itdb_chapter_free', None, [
  1056.         ChapterPtr]),
  1057.     ('itdb_chapter_duplicate', ChapterPtr, [
  1058.         ChapterPtr]),
  1059.     ('itdb_chapterdata_add_chapter', gboolean, [
  1060.         ChapterdataPtr,
  1061.         guint32,
  1062.         gchar_p]),
  1063.     ('itdb_init_ipod', gboolean, [
  1064.         gchar_p,
  1065.         gchar_p,
  1066.         gchar_p,
  1067.         GErrorPtrPtr])]
  1068.  
  1069. def wrap_pointer_return(func):
  1070.     '''If the returned value is a NULL pointer return None instead'''
  1071.     
  1072.     def wrapper(*args, **kwargs):
  1073.         ret = func(*args, **kwargs)
  1074.         if not ret:
  1075.             return None
  1076.  
  1077.     return wrapper
  1078.  
  1079. for name, ret, args in _functions:
  1080.     
  1081.     try:
  1082.         handle = getattr(_lib, name)
  1083.     except AttributeError:
  1084.         print_d('symbol not found: %r' % name)
  1085.         continue
  1086.  
  1087.     handle.argtypes = args
  1088.     handle.restype = ret
  1089.     if hasattr(ret, 'contents'):
  1090.         handle = wrap_pointer_return(handle)
  1091.     globals()[name] = handle
  1092.  
  1093.  
  1094. def sw_get_tracks(itdb_ptr):
  1095.     '''Get tracks in itdb.'''
  1096.     if not itdb_ptr:
  1097.         raise ValueError
  1098.     tracks = []
  1099.     node = itdb_ptr.contents.tracks
  1100.     while node:
  1101.         entry = node.contents
  1102.         track_ptr = cast(entry.data, TrackPtr)
  1103.         tracks.append(track_ptr)
  1104.         node = node.next
  1105.     return tracks
  1106.  
  1107. __all__ = []
  1108. for key in globals().keys():
  1109.     lower = key.lower()
  1110.     if not lower.startswith('itdb_'):
  1111.         if lower.startswith('sw_'):
  1112.             __all__.append(key)
  1113.             continue
  1114.         return None
  1115.